<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('permission_rules', function (Blueprint $table) {
            $table->id();
            $table->timestamps();

            // 权限基本信息
            $table->string('rule_code', 100)->unique(); // 权限规则编码
            $table->string('rule_name', 200); // 权限规则名称
            $table->string('rule_type', 50); // menu, field, data, action
            $table->text('description')->nullable(); // 权限描述

            // 权限对象
            $table->string('resource_type', 50); // employee, department, position, user, etc.
            $table->string('resource_code', 100)->nullable(); // 资源编码
            $table->string('resource_name', 200)->nullable(); // 资源名称

            // 菜单权限
            $table->json('menu_permissions')->nullable(); // 菜单权限配置
            $table->boolean('allow_menu_access')->default(false); // 允许菜单访问
            $table->boolean('allow_menu_create')->default(false); // 允许创建
            $table->boolean('allow_menu_read')->default(false); // 允许读取
            $table->boolean('allow_menu_update')->default(false); // 允许更新
            $table->boolean('allow_menu_delete')->default(false); // 允许删除
            $table->boolean('allow_menu_export')->default(false); // 允许导出

            // 字段权限
            $table->json('field_permissions')->nullable(); // 字段权限配置
            $table->json('visible_fields')->nullable(); // 可见字段
            $table->json('editable_fields')->nullable(); // 可编辑字段
            $table->json('required_fields')->nullable(); // 必填字段
            $table->boolean('allow_field_view')->default(false); // 允许查看字段
            $table->boolean('allow_field_edit')->default(false); // 允许编辑字段

            // 数据权限
            $table->string('data_scope', 50)->default('self'); // self, department, company, custom
            $table->json('data_scope_rules')->nullable(); // 数据范围规则
            $table->json('department_scope')->nullable(); // 部门范围
            $table->boolean('include_sub_departments')->default(false); // 包含子部门

            // 动作权限
            $table->json('action_permissions')->nullable(); // 动作权限配置
            $table->boolean('allow_approve')->default(false); // 允许审批
            $table->boolean('allow_reject')->default(false); // 允许驳回
            $table->boolean('allow_transfer')->default(false); // 允许转交
            $table->boolean('allow_delegate')->default(false); // 允许委托

            // 条件权限
            $table->json('condition_rules')->nullable(); // 条件规则
            $table->string('time_restriction', 100)->nullable(); // 时间限制
            $table->string('amount_restriction', 100)->nullable(); // 金额限制
            $table->integer('level_restriction')->nullable(); // 级别限制

            // 权限层级
            $table->integer('permission_level')->default(1); // 权限级别
            $table->boolean('is_system_rule')->default(false); // 是否系统规则
            $table->boolean('is_inherited')->default(false); // 是否继承

            // 状态管理
            $table->boolean('is_active')->default(true); // 是否启用
            $table->datetime('effective_from')->nullable(); // 生效开始时间
            $table->datetime('effective_to')->nullable(); // 生效结束时间

            // 优先级和冲突解决
            $table->integer('priority')->default(1); // 优先级
            $table->string('conflict_resolution', 50)->default('deny'); // allow, deny, merge

            // 审计信息
            $table->json('audit_log')->nullable(); // 权限变更日志
            $table->datetime('last_accessed')->nullable(); // 最后访问时间
            $table->integer('access_count')->default(0); // 访问次数

            // 备注和附件
            $table->text('notes')->nullable();
            $table->json('attachments')->nullable();

            // 创建者信息
            $table->string('created_by', 100)->nullable();
            $table->string('updated_by', 100)->nullable();

            // 索引
            $table->index(['rule_type', 'is_active'], 'pr_type_active_idx');
            $table->index(['resource_type', 'resource_code'], 'pr_resource_idx');
            $table->index(['data_scope'], 'pr_data_scope_idx');
            $table->index(['permission_level'], 'pr_level_idx');
            $table->index(['is_active'], 'pr_active_idx');
            $table->index(['priority'], 'pr_priority_idx');
            $table->index(['rule_code'], 'pr_code_idx');

            // 唯一约束：同一资源类型的同一资源只能有一种规则类型
            $table->unique(['resource_type', 'resource_code', 'rule_type'], 'unique_resource_rule');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('permission_rules');
    }
};
